package one_many

import (
	"app/out"
	"sync"
)

// Task 表示一个任务实例
type Task struct {
	ID int64
}

// run 任务的方法，表示执行这个任务
func (t *Task) run() {
	out.Input(t.ID)
}

const taskNum int64 = 10000

// producer 生产者向通道写入taskNum个Task
func producer(taskCh chan<- Task) {
	var i int64
	for i = 1; i <= taskNum; i++ {
		taskCh <- Task{
			ID: i,
		}
	}

	close(taskCh) //这里关闭了channel，消费者for range在读取完后，才会结束函数。否则，会一直阻塞
}

// consumer 消费者读取通道中的Task，然后调用Task.run执行任务
func consumer(taskCh <-chan Task) {
	for task := range taskCh {
		task.run()
	}
}

var taskCh = make(chan Task, 10)

// Exec 执行生产者、消费者
func Exec() {
	var wg sync.WaitGroup
	wg.Add(6)
	//1个生产者
	go func() {
		defer wg.Done()
		producer(taskCh)
	}()
	//5个消费者
	for i := 0; i < 5; i++ {
		go func() {
			defer wg.Done()
			consumer(taskCh)
		}()
	}
	wg.Wait()

}
